package com.xdjd.mobile.business.util;

import com.google.common.base.Strings;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public abstract class ParamCheckUtils {

    private static final Logger logger = LoggerFactory.getLogger(ParamCheckUtils.class);

    /**
     * 校验中文姓名
     *
     * @param chineseName 中文名字
     * @param nullMsg     为空时的错误提示信息
     * @param errMsg      格式错误时的提示信息
     */
    public static void checkChineseName(String chineseName, String nullMsg, String errMsg) {
        Assert.isTrue(ArgsCheck.isNull(chineseName), Strings.isNullOrEmpty(nullMsg) ? "姓名不能为空" : nullMsg);
        Assert.isTrue(ArgsCheck.checkStrLength(chineseName, 1, 16), Strings.isNullOrEmpty(errMsg) ? "姓名最大16个字符" : errMsg);
    }

    /**
     * 校验字符串长度
     *
     * @param data   字符串
     * @param minLen 最小长度
     * @param maxLen 最大长度
     * @param errMsg 错误信息
     */
    public static void checkStringLength(String data, int minLen, int maxLen, String errMsg) {
        Assert.isTrue(ArgsCheck.checkStrLength(data, minLen, maxLen), errMsg);
    }

    /**
     * 校验身份证号是否合法
     *
     * @param idNo
     * @return
     */
    public static void checkIdCard(String idNo) {
        Assert.isTrue(ArgsCheck.isCard(idNo), "身份证号码不合法");
    }

    /**
     * 校验身份证号是否合法
     *
     * @param idNo
     * @return
     */
    public static void checkIdCard(String idNo, String errMsg) {
        Assert.isTrue(ArgsCheck.isCard(idNo), StringUtils.defaultIfEmpty(errMsg, "身份证号码格式错误"));
    }

    /**
     * @param regex
     *            正则表达式字符串
     * @param str
     *            要匹配的字符串
     * @return 如果str 符合 regex的正则表达式格式,返回true, 否则返回 false;
     */
    private static boolean match(String regex, String str) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        return matcher.matches();
    }

    /**
     * 判断登陆密码是否符合格式
     * @param str
     * @return
     */
    public static boolean isLoginPwd(String str) {
        if (isNotJustNumber(str) && isNotJustLetters(str)) {
            if (!isSpecialCharacters(str)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 验证不是纯数字
     * @param str
     * @return
     */
    public static boolean isNotJustNumber(String str) {
        String regex = "(?![0-9]+$)[\\S]{8,16}";
        return match(regex, str);
    }

    /**
     * 验证不是纯字母
     * @param str
     * @return
     */
    public static boolean isNotJustLetters(String str) {
        String regex = "(?![a-zA-Z]+$)[\\S]{8,16}";
        return match(regex, str);
    }

    /**
     * 验证是纯特殊字符
     * @param str
     * @return
     */
    public static boolean isSpecialCharacters(String str) {
        String regex = "([`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]{8,16})";
        return match(regex, str);
    }



    private static Pattern licenseNoCheckpattern = Pattern.compile("^[\u4e00-\u9fa5|WJ]{1}[A-Z0-9]{6}$");

    /**
     * 校验参数存在
     */
    public static void checkParamExist(String paramData, String errMsg) {
        if (!org.springframework.util.StringUtils.hasText(errMsg)) {
            errMsg = "参数不完整";
        }
        Assert.isTrue(ArgsCheck.isNull(paramData), errMsg);
    }


    /**
     *  时间戳校验
     */
    public static void checkTimeSign(String timeSign) {
        Assert.isTrue(ArgsCheck.isNull(timeSign), "时间戳为空");
        Assert.isTrue(ArgsCheck.isDigit(timeSign, 14, 14), "时间戳格式错误");
    }



    /**
     * @param numStr 数字字符串
     * @param minLen 最小长度
     * @param maxLen 最大长度
     * @param error  错误提示信息
     * @Description: 校验字符串是否为数字
     */
    public static void checkIsDigit(String numStr, int minLen, int maxLen, String error) {
        if (!org.springframework.util.StringUtils.hasText(error)) {
            error = "不是一个合法的数字";
        }
        Assert.isTrue(ArgsCheck.isNull(numStr), error);
        Assert.isTrue(ArgsCheck.isDigit(numStr, minLen, maxLen), error);
    }

    /**
     *  校验手机号码格式
     */
    public static void checkMobileNo(String mobileNo, String errMsg) {
        Assert.isTrue(ArgsCheck.checkStrLength(mobileNo, 11, 11), "手机号长度必须为11位");
        Assert.isTrue(ArgsCheck.checkMobileNumber(mobileNo), Strings.isNullOrEmpty(errMsg) ? "您输入的手机号码错误" : errMsg);
        //Assert.isTrue(ArgsCheck.checkMobileEffective(mobileNo), "手机号为虚拟号码");
    }

    /**
     *  校验渠道订单号
     */
    public static void checkChannelOrderId(String cOrderId) {
        Assert.isTrue(ArgsCheck.isNull(cOrderId), "渠道订单号不能为空");
        Assert.isTrue(ArgsCheck.checkStrLength(cOrderId, 1, 40), "渠道订单号格式错误");
    }

    /**
     * 校验金额分格式
     */
    public static void checkAmountFen(String fen, String errMsg) {
        Assert.isTrue(ArgsCheck.isDigit(fen, 1, 12), errMsg);
    }

    /**
     * 校验金额元格式, 最多带3位小数
     */
    public static void checkAmountYuan(String yuan, String errMsg) {
        Assert.isTrue(ArgsCheck.isFloat(yuan), errMsg);
    }

    /**
     *  校验8位日期格式
     */
    public static void checkDate8(String yyyyMMdd, String errMsg) {
        Assert.isTrue(ArgsCheck.isDigit(yyyyMMdd, 8, 8), errMsg);
    }

    /**
     *  校验为真
     */
    public static void checkIsTrue(boolean expression, String errMsg) {
        Assert.isTrue(expression, errMsg);
    }

    /**
     *  校验身份证号码
     */
    public static void checkIdNo(String idNo) {
        Assert.isTrue(ArgsCheck.isCard(idNo), "身份证号码格式错误");
    }

    /**
     *  分页参数，查询页数格式校验
     */
    public static Integer checkPageNum(String pageNum) {
        Assert.isTrue(ArgsCheck.isDigit(pageNum, 1, 10), "查询页码错误");
        return Integer.valueOf(pageNum);
    }

    /**
     *  分页参数，查询每页数量格式校验
     */
    public static Integer checkPageSize(String pageSize) {
        Assert.isTrue(ArgsCheck.isDigit(pageSize, 1, 10), "每页数量错误");
        return Integer.valueOf(pageSize);
    }

    /**
     *  校验业务ID
     */
    public static void checkBusinessId(String businessId) {
        Assert.isTrue(ArgsCheck.isNull(businessId), "业务ID为空");
        Assert.isTrue(ArgsCheck.isDigit(businessId, 1, 6), "业务ID格式错误");
    }

    /**
     *  校验邮箱格式
     */
    public static void checkEmail(String email) {
        Assert.isTrue(ArgsCheck.isEmail(email), "您输入的邮箱地址错误");
    }

    /**
     * 校验中文姓名
     */
    public static void checkChineseName(String name) {
        Assert.isTrue(ArgsCheck.isChineseWord(name, 1, 20), "姓名格式错误");
    }

    /**
     * 校验参数对象是否为空
     */
    public static void checkExist(Object req) {
        Assert.notNull(req, "参数不能为空");
    }

    /**
     *  校验参数对象是否为空
     */
    public static void checkExist(Object req, String errorMsg) {
        Assert.notNull(req, errorMsg);
    }


    /**
     * 根据身份证号返回生日
     *
     * @param idNo
     * @return
     */
    public static String checkIdNoByBirthday(String idNo) {
        if (idNo == null || idNo.length() != 18) {
            return null;
        }
        return idNo.substring(6, 10) + "-" + idNo.substring(10, 12) + "-" + idNo.substring(12, 14);
    }

    /**
     * 根据身份证返回男女
     *
     * @param idNo
     * @return
     */
    public static Integer checkIdNoByGender(String idNo) {
        if (idNo == null || idNo.length() != 18) {
            return null;
        }
        if (Integer.valueOf(idNo.substring(16, 17)) % 2 == 0) {
            return 2;
        }
        return 1;
    }
}
